package com.learn.spring.test;

import com.learn.spring.entity.TUser;
import com.learn.spring.service.JdbcTemplateService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.ArrayList;
import java.util.List;

public class Case5 {

    /**
     * 1、什么是 JdbcTemplate
     * (1) Spring 框架对 JDBC 进行封装，使用 JdbcTemplate 方便实现对数据库操作
     * 2、准备工作
     * (1) 引入相关jar包
     *   spring-jdbc
     *   spring-tx 针对事务的一些操作依赖
     *   spring-orm 整合其他数据操作库需要，比如myBites等，如果没有使用可以不依赖，springTemplate是spring的所以可以不用导入
     *   mysql-connector-java 是MySQL的JDBC驱动包，用JDBC连接MySQL数据库时必须使用该jar包。
     *   druid 数据库链接池
     *
     *   数据库操作中涉及众多包，关系复杂，需要理清楚中间关系：
     *   JDBC (Java Database Connectivity)是一组接口，是 java 为了程序员可以统一方便简单的使用和维护数据库而提出的一套接口规范api
     *   数据库驱动，如：mysql-connector-java ，是由数据库厂商提供的，实现了 JDBC 接口规范的一套真正操作数据库的源码库。不同版本不同厂商可能驱动不同。
     *   jdbc每次会建立一个链接操作数据库，通过 socket 链接完成 io 操作，链接过程是查询中比较耗时的一部分，所以如果经常需要访问不必每次都关闭重新连接，所以可以用池子来管理
     *   druid 就是这样的一个数据库连接池。数据库连接池有很多，大致是这样的性能对比： hikariCP > druid > tomcat-jdbc > dbcp > c3p0；
     *   druid 是阿里推出的一款数据库链接池，2021年据闻已经被阿里放弃了，改用 hikariCP
     *   spring-jdbc 是针对 jdbc 的封装，简化了API接口，让使用者更加轻松简单的去使用 JDBC。
     *   ORM 框架是指实体关系映射框架。即对象与表的映射。操作对象即操作表，是对 JDBC 具体实用一种封装，即便没有ORM框架我们也可以写SQL语句去操作JDBC对数据库完成修改。
     *   ORM 将对SQL的操作变成了对对象的属性操作，起底层依旧依赖 JDBC ， 通过操作JDBC完成数据库操作，对于访问速度要求ORM框架也可以选择实用连接池来优化。
     *   参考：https://blog.csdn.net/qq_42146775/article/details/106603082
     *       https://blog.csdn.net/qq_33327680/article/details/82788572
     *       https://baijiahao.baidu.com/s?id=1676727190638510759
     * (2) 在 xml 配置数据库 bean 配置（beans7.xml）
     * (3) 配置 JdbcTemplate 对象，注入 DataSource
     * (4) 创建 service和dao类
     */
    @Test
    public void test1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        jdbcTemplateService.addUser(new TUser("summer1", "lx01020922", "男", 22));
    }

    @Test
    public void test2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        jdbcTemplateService.updateUser(new TUser(135, "summer-lw", "lx0102", "男", 33));
    }

    @Test
    public void test3() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        jdbcTemplateService.deleteUser(137);
    }

    @Test
    public void test4() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        System.out.println("共" + jdbcTemplateService.findCount() + "条数据");
    }

    @Test
    public void test5() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        System.out.println("用户信息：" + jdbcTemplateService.findUser(138));
    }

    @Test
    public void test6() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        System.out.println("用户信息列表：\n" + jdbcTemplateService.findAllUser());
    }

    @Test
    public void test7() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{"lwxf1", "1111", "男", 22});
        list.add(new Object[]{"lwxf2", "2222", "女", 22});
        list.add(new Object[]{"lwxf3", "3333", "男", 22});
        jdbcTemplateService.batchAddUser(list);
    }

    @Test
    public void test8() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{"lw1", "111221", "男", 22, 139});
        list.add(new Object[]{"lw2", "222211", "女", 22, 140});
        list.add(new Object[]{"lw3", "322333", "男", 22, 141});
        jdbcTemplateService.batchUpdateUser(list);
    }
    @Test
    public void test9() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");
        JdbcTemplateService jdbcTemplateService = context.getBean("jdbcTemplateService", JdbcTemplateService.class);
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{139});
        list.add(new Object[]{140});
        list.add(new Object[]{141});
        jdbcTemplateService.batchDeleteUser(list);
    }

}
